Snowflake: Snowsqlの出力結果フォーマットは(snowsqlコマンド実行時の)output_formatパラメータで指定・変更可能です
タイトルで言いたいことを言い切った感がありますが、そうなんです。この件でちょっと困っていたんです。
困っていたというか、まぁ『これが解決出来なければ死ぬ』って程では無いですが、もうちょっと便利な方法ないかなーと。
というのも、ちょうど下記のエントリを書くにあたってSnowsqlで色々結果を表示させていた時に、結果の列数が多いと表示されている内容が表形式ではあるものの(スクリーン表示サイズの問題もあり)だいぶガタガタする感じになってしまっていたので、何か良い感じに出力方式を切り替えられないかな、というのが発端でした。
例えば、Amazon Redshiftにおける以下のような方法等です。
当エントリでは、Snowflake(Snowsql)でも出力形式を切り替えられるよ!という内容を紹介したいと思います。
目次
どこを切り替えれば対応出来るのか
SnowsqlにおけるSQL実行結果の出力形式の変更は、SnowSQL 構成オプションの1つである『output_format』を使う事で行なえます。
通常(デフォルト)クエリを実行した場合の出力結果
通常、特に何も出力結果部分の指定を行わなかった時のデフォルトの挙動は以下のような書式となります。設定値的にはoutput_format=psql
が指定されている形となるようです。
saiki_akari#MESOKO_WH_X_SMALL@MESOKO_DB.(no schema)> SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id; +---------+-----------+------------+ | USER_ID | USER_NAME | BIRTHDAY | |---------+-----------+------------| | 111 | AAAA | 2020-10-14 | | 222 | BBBB | 2020-10-14 | | 444 | ZZZZ | 2020-10-14 | | 555 | EEEE | 2020-10-14 | +---------+-----------+------------+ 4 Row(s) produced. Time Elapsed: 0.142s
なお、環境やデータは下記エントリを書いた時に作ったものを活用しました。
指定パラメータ別 出力結果サンプル
以降のセクションでは、それぞれパラメータを指定してクエリを実行してみるとどのような結果が得られるかを実際に試してみた結果を列挙しています。手間を省くためにsnowsql実行時のパラメータに(-q
パラメータを使って)クエリ内容も含める形で実行しています。
「csv」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=csv Password: * SnowSQL * v1.2.10 Type SQL statements or !help "USER_ID","USER_NAME","BIRTHDAY" "111","AAAA","2020-10-14" "222","BBBB","2020-10-14" "444","ZZZZ","2020-10-14" "555","EEEE","2020-10-14" 4 Row(s) produced. Time Elapsed: 0.083s Goodbye!
「expanded」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=expanded Password: * SnowSQL * v1.2.10 Type SQL statements or !help ***************************[ 1 ]*************************** USER_ID | 111 USER_NAME | AAAA BIRTHDAY | 2020-10-14 ***************************[ 2 ]*************************** USER_ID | 222 USER_NAME | BBBB BIRTHDAY | 2020-10-14 ***************************[ 3 ]*************************** USER_ID | 444 USER_NAME | ZZZZ BIRTHDAY | 2020-10-14 ***************************[ 4 ]*************************** USER_ID | 555 USER_NAME | EEEE BIRTHDAY | 2020-10-14 4 Row(s) produced. Time Elapsed: 0.143s Goodbye!
「fancy_grid」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=fancy_grid Password: ❄ SnowSQL ❄ v1.2.10 Type SQL statements or !help ╒═════════╤═══════════╤════════════╕ │ USER_ID │ USER_NAME │ BIRTHDAY │ ╞═════════╪═══════════╪════════════╡ │ 111 │ AAAA │ 2020-10-14 │ ├─────────┼───────────┼────────────┤ │ 222 │ BBBB │ 2020-10-14 │ ├─────────┼───────────┼────────────┤ │ 444 │ ZZZZ │ 2020-10-14 │ ├─────────┼───────────┼────────────┤ │ 555 │ EEEE │ 2020-10-14 │ ╘═════════╧═══════════╧════════════╛ 4 Row(s) produced. Time Elapsed: 1.487s Goodbye!
「grid」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=grid Password: * SnowSQL * v1.2.10 Type SQL statements or !help +---------+-----------+------------+ | USER_ID | USER_NAME | BIRTHDAY | +=========+===========+============+ | 111 | AAAA | 2020-10-14 | +---------+-----------+------------+ | 222 | BBBB | 2020-10-14 | +---------+-----------+------------+ | 444 | ZZZZ | 2020-10-14 | +---------+-----------+------------+ | 555 | EEEE | 2020-10-14 | +---------+-----------+------------+ 4 Row(s) produced. Time Elapsed: 0.292s Goodbye!
「html」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=html Password: * SnowSQL * v1.2.10 Type SQL statements or !help <table> <tr><th style="text-align: right;">USER_ID</th><th>USER_NAME</th><th>BIRTHDAY </th></tr> <tr><td style="text-align: right;"> 111</td><td>AAAA </td><td>2020-10-14</td></tr> <tr><td style="text-align: right;"> 222</td><td>BBBB </td><td>2020-10-14</td></tr> <tr><td style="text-align: right;"> 444</td><td>ZZZZ </td><td>2020-10-14</td></tr> <tr><td style="text-align: right;"> 555</td><td>EEEE </td><td>2020-10-14</td></tr> </table> 4 Row(s) produced. Time Elapsed: 0.125s Goodbye!
「json」の場合
※都合上改行して表示させていますが実際は改行無しの1行で出力されています。
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=json Password: * SnowSQL * v1.2.10 Type SQL statements or !help [ {"USER_ID": "111", "USER_NAME": "AAAA", "BIRTHDAY": "2020-10-14"}, {"USER_ID": "222", "USER_NAME": "BBBB", "BIRTHDAY": "2020-10-14"}, {"USER_ID": "444", "USER_NAME": "ZZZZ", "BIRTHDAY": "2020-10-14"}, {"USER_ID": "555", "USER_NAME": "EEEE", "BIRTHDAY": "2020-10-14"} ] 4 Row(s) produced. Time Elapsed: 0.117s Goodbye!
「latex」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=latex Password: * SnowSQL * v1.2.10 Type SQL statements or !help \begin{tabular}{rll} \hline USER\_ID & USER\_NAME & BIRTHDAY \\ \hline 111 & AAAA & 2020-10-14 \\ 222 & BBBB & 2020-10-14 \\ 444 & ZZZZ & 2020-10-14 \\ 555 & EEEE & 2020-10-14 \\ \hline \end{tabular} 4 Row(s) produced. Time Elapsed: 0.095s Goodbye!
「latex_booktabs」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=latex_booktabs Password: * SnowSQL * v1.2.10 Type SQL statements or !help \begin{tabular}{rll} \toprule USER\_ID & USER\_NAME & BIRTHDAY \\ \midrule 111 & AAAA & 2020-10-14 \\ 222 & BBBB & 2020-10-14 \\ 444 & ZZZZ & 2020-10-14 \\ 555 & EEEE & 2020-10-14 \\ \bottomrule \end{tabular} 4 Row(s) produced. Time Elapsed: 0.122s Goodbye!
「mediawiki」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=mediawiki Password: * SnowSQL * v1.2.10 Type SQL statements or !help {| class="wikitable" style="text-align: left;" |+ <!-- caption --> |- ! align="right"| USER_ID !! USER_NAME !! BIRTHDAY |- | align="right"| 111 || AAAA || 2020-10-14 |- | align="right"| 222 || BBBB || 2020-10-14 |- | align="right"| 444 || ZZZZ || 2020-10-14 |- | align="right"| 555 || EEEE || 2020-10-14 |} 4 Row(s) produced. Time Elapsed: 0.097s Goodbye!
「orgtbl」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=orgtbl Password: * SnowSQL * v1.2.10 Type SQL statements or !help | USER_ID | USER_NAME | BIRTHDAY | |---------+-----------+------------| | 111 | AAAA | 2020-10-14 | | 222 | BBBB | 2020-10-14 | | 444 | ZZZZ | 2020-10-14 | | 555 | EEEE | 2020-10-14 | 4 Row(s) produced. Time Elapsed: 0.079s Goodbye!
「pipe」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=pipe Password: * SnowSQL * v1.2.10 Type SQL statements or !help | USER_ID | USER_NAME | BIRTHDAY | |--------:|:----------|:-----------| | 111 | AAAA | 2020-10-14 | | 222 | BBBB | 2020-10-14 | | 444 | ZZZZ | 2020-10-14 | | 555 | EEEE | 2020-10-14 | 4 Row(s) produced. Time Elapsed: 0.093s Goodbye!
「plain」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=plain Password: * SnowSQL * v1.2.10 Type SQL statements or !help USER_ID USER_NAME BIRTHDAY 111 AAAA 2020-10-14 222 BBBB 2020-10-14 444 ZZZZ 2020-10-14 555 EEEE 2020-10-14 4 Row(s) produced. Time Elapsed: 0.121s Goodbye!
「psql」の場合
指定無しの場合のデフォルト表示形式。
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=psql Password: * SnowSQL * v1.2.10 Type SQL statements or !help +---------+-----------+------------+ | USER_ID | USER_NAME | BIRTHDAY | |---------+-----------+------------| | 111 | AAAA | 2020-10-14 | | 222 | BBBB | 2020-10-14 | | 444 | ZZZZ | 2020-10-14 | | 555 | EEEE | 2020-10-14 | +---------+-----------+------------+ 4 Row(s) produced. Time Elapsed: 0.098s Goodbye!
「rst」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=rst Password: * SnowSQL * v1.2.10 Type SQL statements or !help ======= ========= ========== USER_ID USER_NAME BIRTHDAY ======= ========= ========== 111 AAAA 2020-10-14 222 BBBB 2020-10-14 444 ZZZZ 2020-10-14 555 EEEE 2020-10-14 ======= ========= ========== 4 Row(s) produced. Time Elapsed: 0.113s Goodbye!
「simple」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=simple Password: * SnowSQL * v1.2.10 Type SQL statements or !help USER_ID USER_NAME BIRTHDAY ------- --------- ---------- 111 AAAA 2020-10-14 222 BBBB 2020-10-14 444 ZZZZ 2020-10-14 555 EEEE 2020-10-14 4 Row(s) produced. Time Elapsed: 0.361s Goodbye!
「tsv」の場合
% snowsql \ -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \ -u saiki_akari \ -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \ -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \ -o output_format=tsv Password: * SnowSQL * v1.2.10 Type SQL statements or !help USER_ID USER_NAME BIRTHDAY 111 AAAA 2020-10-14 222 BBBB 2020-10-14 444 ZZZZ 2020-10-14 555 EEEE 2020-10-14 4 Row(s) produced. Time Elapsed: 0.137s Goodbye!
まとめ
という訳で、Snowsqlの出力形式をパラメータで切り替えられるよ、という内容の紹介でした。
調べてみると意外と色々パターンが対応されていたんですね。個人的にはexpanded
で列内容を横に並べるんじゃなくて縦に並べられるのが便利で良いかなと思いました。状況や用途に応じて使い分けていきたいと思います。